package com.swyc.osschat.Test.designMode.combination.run;

import com.swyc.osschat.Test.designMode.combination.base.MenuComponent;
import com.swyc.osschat.Test.designMode.combination.impl.Menu;
import com.swyc.osschat.Test.designMode.combination.impl.MenuItem;

/**
 * @description Java 组合模式
 * 一、定义
 *  组合模式又名部分整体模式，是用于把一组相似的对象当作一个单一的对象，组合模式依据树形结构来组合对象，用来表示部分以及整体层次，这种类型的设计模式属于结构型模式，它创建了对象组的树形结构。
 *  主要角色：
 *      抽象根节点：定义系统各层次对象共有的方法和属性，可以预先定义一些默认行为和属性。
 *      树枝节点：定义树枝节点的行为，存储子节点，组合树枝节点和叶子节点形成一个树形结构。
 *      叶子节点：叶子节点对象，其下无分支，是系统遍历的最小单位。
 * 二、代码实现
 *  举例：在文件管理系统中，常常有根目录和子目录，子目录中又包含着文件和子目录，或者说子目录中包含子目录又包含着文件，如下图所示，这就是一个树型结构。
 *                                                                      文件夹
 *                                                           文件         文件          文件夹
 *                                                                                  文件      文件夹
 *                                                                                         文件       文件
 * 三、总结
 *  组合模式可以清楚地定义分层次的复杂对象，表示对象的全部或部分层次，让客户端忽略了层次的差异，方便对整个层次结构进行控制。
 *  客户端可以一致地使用一个组合结构或其中单个对象，不必关心处理的单个对象还是整个组合结构，简化了客户端代码。
 *  组合模式中增加新树枝节点或者叶子节点都很方便，无需修改现有类，符合开闭原则。
 *  组合模式为树形结构的面向对象实现提供了一种灵活的解决方案，通过叶子节点和树枝节点的递归组合可以形成复杂的树形结构，对树形结构的控制非常简单。
 *  所以组合模式的应用场景就是出现在树形结构的地方，比如文件目录，多级目录等呈现树形结构的程序。
 * @Author: z156940l@outlook.com
 * @className Test
 * @Date: 2022/7/21 17:36
 */
public class Test {

    public static void main(String[] args) {
        //创建根目录
        MenuComponent menuComponent = new Menu("根目录",1);
        //添加两个子菜单项
        menuComponent.add(new MenuItem("英雄联盟",2));
        menuComponent.add(new MenuItem("地下城",2));

        //创建二级目录
        MenuComponent menu1 = new Menu("办公",2);
        menu1.add(new MenuItem("微信",3));
        menu1.add(new Menu("QQ",3));
        //将二级目录添加至根目录
        menuComponent.add(menu1);
        menuComponent.print();
    }
}
